EventBridge ルールで CloudWatch Logs にイベントが出力されないときの対処方法

EventBridge ルールで CloudWatch Logs にイベントが出力されないときの対処方法

Clock Icon2025.01.20

困っていた内容

EventBridge ルールのターゲットとして CloudWatch Logs を設定しています。
先日、イベントが生成され Invocations や TriggeredRules メトリクスも記録されましたが、CloudWatch Logs にイベントが出力されていませんでした。

なぜでしょうか?原因と対処法を教えてください。

なお、FailedInvocations メトリクスも記録され、デッドレターキューに次のメッセージ属性のメッセージが送信されていました。

NO_PERMISSIONS
ERROR_MESSAGE: Could not complete putLogEvents call for /aws/events/hato-CloudWatchLogs

どう対応すればいいの?

CloudWatch Logs のリソースベースポリシーを確認してください。

CloudWatch Logs のリソースベースポリシーを確認する方法を教えてください | DevelopersIO

EventBridge ルールのターゲットとして CloudWatch Logs を指定する場合、CloudWatch Logs のリソースベースポリシーにログ送信を許可するポリシーが必要です。アクションが許可されていない場合、イベントの出力に失敗し FailedInvocations メトリクスやデッドレターキューにメッセージが配信されます。

そのため、CloudWatch Logs に EventBridge からのアクションを許可するポリシーが含まれているか確認してください。

許可するポリシー例
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "TrustEventsToStoreLogEvent",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "events.amazonaws.com",
          "delivery.logs.amazonaws.com"
        ]
      },
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/events/*:*"
    }
  ]
}

AWS CLI でポリシーを設定する

AWS CLI でポリシーを設定(作成/更新)する場合は次のコマンドを実行します。

Resourceの AWS アカウント ID(123456789012)は修正が必要です。

コマンド例
aws logs put-resource-policy \
    --policy-name "TrustEventsToStoreLogEvents" \
    --policy-document '{
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "TrustEventsToStoreLogEvent",
          "Effect": "Allow",
          "Principal": {
            "Service": [
              "events.amazonaws.com",
              "delivery.logs.amazonaws.com"
            ]
          },
          "Action": [
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/events/*:*"
        }
      ]
      }'

なお、AWS マネージメントコンソールから CloudWatch Logs を設定した場合は、自動的に上記のようなポリシーが設定されます。

また、CloudFormation からを設定する場合は、次のブログが参考になると思います。

https://dev.classmethod.jp/articles/tsnote-cloudwatch-cwlogs-eventrule-cfn/

参考資料

CloudWatch Logs がルールのターゲットである場合、EventBridge がログストリームを作成し、CloudWatch Logs がログエントリとしてイベントからテキストを保存します。EventBridge がログストリームを作成してイベントを記録するためには、EventBridge が CloudWatch Logs に書き込むことを可能にするリソースベースポリシーを CloudWatch Logs に含める必要があります。

AWS Management Console を使用して、CloudWatch Logs をルールのターゲットとして追加する場合、リソースベースのポリシーは自動的に作成されます。AWS CLI を使用してターゲットを追加し、ポリシーがまだ存在しない場合は、作成する必要があります。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.